# author@bupt_kt
# date@08/22/2021

import numpy as np

##读取训练集数据
def input_data():
    data=[]
    label=[] ##创建标签数组，为每一项数据做标记
    file=open(r'Mnist/mnist_train.csv','r')
    for line in file.readlines():
        l=line.strip().split(',')
        if (int(l[0])>=5) :
            label.append(1)
        else :
            label.append(-1)
        data.append([int(num) for num in l[1:]])    ##这里的数据特指数据集中的x
    return data,label

##进行模型训练
def training(data,label):
    data=np.mat(data)  ##将数据集转化为矩阵，方便后续运算
    m,n=np.shape(data) ##获得数据集的行列数
    w=np.zeros((1,n)) ##w初始化为全0矩阵
    b=0
    e=0.0001
    for i in range(10):##迭代十次进行训练
        for k in range(m):
            y=label[k]
            x=data[k]
            if y*(w*x.T+b)<=0 :
                w+=e*y*x
                b+=e*y
        print("training process: %d/10" %(i+1))

    return w,b



def test(w,b): ##测试模型成功率
    file=open(r'Mnist/mnist_test.csv','r')
    error=0
    data=[]
    label=[]
    for lines in file.readlines():
        l=lines.strip().split(',')
        if int(l[0])>=5 :
            label.append(1)
        else :
            label.append(-1)
        data.append([int(num) for num in l[1:]])
    data=np.mat(data)
    m,n=np.shape(data)
    for i in range(m):
        y=label[i]
        x=data[i].T
        if y*(w*x+b)<=0 :
            error+=1
    print((m-error)/m)
    return

if __name__ == '__main__':
    data,label=input_data()
    w,b=training(data,label)
    test(w,b)